package com.iotcomm.client;

import com.iotcomm.listener.MessageListener;
import com.iotcomm.protocol.Message;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 客户端消息处理器
 * 处理与服务器的连接、消息接收等事件
 */
public class ClientHandler extends SimpleChannelInboundHandler<Message> {
    private static final Logger logger = LoggerFactory.getLogger(ClientHandler.class);
    
    private final MessageListener messageListener;
    private ChannelHandlerContext context;
    
    /**
     * 构造函数
     * @param messageListener 消息监听器
     */
    public ClientHandler(MessageListener messageListener) {
        this.messageListener = messageListener;
    }
    
    /**
     * 连接建立时触发
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        this.context = ctx;
        String channelId = ctx.channel().id().asShortText();
        
        logger.info("连接到服务器成功: {}", channelId);
        
        if (messageListener != null) {
            messageListener.onClientConnected(channelId);
        }
    }
    
    /**
     * 连接断开时触发
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        String channelId = ctx.channel().id().asShortText();
        
        logger.info("与服务器断开连接: {}", channelId);
        
        if (messageListener != null) {
            messageListener.onClientDisconnected(channelId, null);
        }
    }
    
    /**
     * 接收到消息时触发
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Message msg) {
        String channelId = ctx.channel().id().asShortText();
        
        logger.debug("接收到消息: {} from server", msg);
        
        if (messageListener != null) {
            messageListener.onMessageReceived(msg, channelId);
        }
    }
    
    /**
     * 异常处理
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        String channelId = ctx.channel().id().asShortText();
        
        logger.error("连接异常: {}", channelId, cause);
        
        if (messageListener != null) {
            messageListener.onConnectionError(channelId, cause);
        }
        
        ctx.close();
    }
    
    /**
     * 发送消息到服务器
     * @param message 要发送的消息
     */
    public void sendMessage(Message message) {
        if (context != null && context.channel().isActive()) {
            context.writeAndFlush(message);
            logger.debug("发送消息到服务器: {}", message);
        } else {
            logger.warn("连接未建立或已断开，无法发送消息: {}", message);
        }
    }
    
    /**
     * 检查连接是否活跃
     * @return 连接是否活跃
     */
    public boolean isConnected() {
        return context != null && context.channel().isActive();
    }
    
    /**
     * 关闭连接
     */
    public void disconnect() {
        if (context != null) {
            context.close();
            logger.info("主动断开与服务器的连接");
        }
    }
}